<?php
//  echo date('Y-m-d H:i:s');die;
session_start();
class Upload
{
  private $filepath = './upload'; //上传目录
  private $tmpPath; //PHP文件临时目录
  private $blobNum; //第几个文件块
  private $blobAcceptNum; //成功收总块数
  private $totalBlobNum; //文件块总数
  private $fileName; //文件名
  private $md5FileName;

  public function __construct($tmpPath, $blobNum, $totalBlobNum, $fileName, $md5FileName = '')
  {

    $md5FileName = md5(111);
    $this->tmpPath = $tmpPath;
    $this->blobNum = $blobNum;
    $this->totalBlobNum = $totalBlobNum;
    
    $this->fileName = $this->createName($fileName, $md5FileName);
    $this->blobAcceptNum = $_SESSION[md5($this->fileName)]&& $blobNum!=0 ? $_SESSION[md5($this->fileName)] : 0;
    //下面这句是测试合并专用
    // $this->blobAcceptNum = $_SESSION[md5($this->fileName)] ? $_SESSION[md5($this->fileName)] : 0;
    //测试合请注释下面这句
    $this->moveFile();
    $this->fileMerge();
  }

  //判断是否是最后一块，如果是则进行文件合成并且删除文件块
  private function fileMerge()
  {
    
    if ($this->blobAcceptNum == $this->totalBlobNum) {

      $blob = '';
      for ($i = 0; $i <= ($this->totalBlobNum-1); $i++) {
        $blob = file_get_contents($this->filepath . '/' . $this->fileName . '__' . $i);
        file_put_contents($this->filepath . '/' . $this->fileName, $blob, FILE_APPEND);
      }
      die;
      // $this->deleteFileBlob();
    }
  }

  //删除文件块
  private function deleteFileBlob()
  {
    for ($i = 1; $i <= $this->totalBlobNum; $i++) {
      @unlink($this->filepath . '/' . $this->fileName . '__' . $i);
    }
  }


  private function moveFile()
  {
    $this->touchDir();
    $filename = $this->filepath . '/' . $this->fileName . '__' . $this->blobNum;
    move_uploaded_file($this->tmpPath, $filename);
    $this->blobAcceptNum++;
    $_SESSION[md5($this->fileName)] = $this->blobAcceptNum;
  }

  //API返回数据
  public function apiReturn()
  {
    if ($this->blobAcceptNum == $this->totalBlobNum) {
      if (file_exists($this->filepath . '/' . $this->fileName)) {
        $data['code'] = 2;
        $data['msg'] = 'success';
        $data['file_path'] = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['DOCUMENT_URI']) . str_replace('.', '', $this->filepath) . '/' . $this->fileName;
      }
    } else {
      if (file_exists($this->filepath . '/' . $this->fileName . '__' . $this->blobNum)) {
        $data['code'] = 1;
        $data['msg'] = 'waiting';
        $data['file_path'] = '';
        $data['blobAcceptNum'] =  $this->blobAcceptNum;
      }
    }
    header('Content-type: application/json');
    echo json_encode($data);
  }


  private function touchDir()
  {
    if (!file_exists($this->filepath)) {
      return mkdir($this->filepath);
    }
  }

  private function createName($fileName, $md5FileName)
  {
    return $md5FileName . '.' . pathinfo($fileName)['extension'];
  }
}


$upload = new Upload($_FILES['file']['tmp_name'], $_POST['blob_num'], $_POST['total_blob_num'], $_POST['file_name'], $_POST['md5_file_name']);

$upload->apiReturn();
